iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0

Day4 建造地基!使用 Docker

在收租之前,我們得先來想想如何打好地基、建造出理想中的房子,接著就能進行房間隔局的設計。乍看之下有很多前置工作,但其實並不困難,現在讓我們開始吧!

環境說明

本系列文章會在 Linux Ubuntu 作業系統下進行示範,並使用 Docker 容器化各項服務來減少繁瑣的安裝程序。

使用 Python 為主要開發語言,Django 則會採用有長期支持(LTS) 3.2 版本。將會安裝 PostgresSQL 的 schema 來進行資料隔離,最後的部署階段會用 Nginx 來做為我們的網路伺服器。

這裡建議想跟著文章一起走的讀者安裝一台 Ubuntu 的虛擬機與 VScode 編輯器,學習體驗更佳!(本文礙於篇幅就不贅述安裝教學,請自行上網尋找教學囉)

作業系統:Ubuntu 22.04

Python 版本:3.10.4

Django 版本:3.2

PostgresSQL 版本:14.4

Nginx 版本:1.21.1

Docker 介紹

Docker 是一種軟體平台,可以用於建置、部署及管理容器化的應用程式。

Docker Container (容器)可以想像是一個獨立隔離的虛擬化環境,透過容器化我們可以將應用程式、資料庫分開管理而不互相影響,還能夠自動建立、重複使用與版本化管理。而有多個容器時在本地主機(安裝 Docker 的主機)可以透過多容器工具(例如 Docker Compose)進行整合來建立與啟動所有服務。

安裝 Docker

設定 apt 套件,並允許透過 HTTPS

sudo apt-get update
sudo apt-get install \
  ca-certificates \
  curl \
  gnupg \
  lsb-release

加入 Docker GPG key

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

設置儲存庫

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安裝 Docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

測試是否安裝完成

sudo docker run hello-world

...
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

安裝 Docker Compose

docker compose version

...
Docker Compose version v2.6.0

不習慣使用 CLI,使用自訂別名

echo 'alias docker-compose="docker compose"' >> ~/.bashrc
source ~/.bashrc
docker-compose version

...
Docker Compose version v2.6.0

以非 root 身分管理 Docker,,使用 vscode 管理很方便(此方式安全性較低,正式環境請斟酌使用)

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
sudo chmod 666 /var/run/docker.sock

到這裡,我們已經把 Docker 的環境架設完成了

使用 Docker 運行 Python 環境

接著要建立我們的專案主目錄,這裡的範例專案命名為 example_tenant

mkdir ~/example_tenant

在目錄底下建立一個 Dockerfile

cd ~/example_tenant
touch Dockerfile

在 Dockerfile 編輯以下內容

FROM ubuntu:22.04

# set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV TZ="Asia/Taipei"
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

# Install python 3.10
RUN apt-get update -y
RUN apt-get install python3.10 python3.10-dev -y

建立 image

docker build -t example_tenant . # 使用當前目錄的 Dockerfile 建立容器

...
Successfully built 0e2dc7586b91
Successfully tagged example_tenant:latest

測試運行

docker run -it example_tenant /bin/bash # 運行並進入容器
python3.10

...
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

成功在 Docker 環境裡面運行 Python 3.10 囉!

為什麼要使用 Docker 呢?筆者會開始使用 Docker 是曾經同時開發太多專案,一直開關各專案的服務來切換環境真的很耗心力。

自從開始使用 Docker 來進行容器化管理,就像是從現實世界到了魔法世界,理解原理與指令後如同學會了魔法,複雜的環境都能梳理的井井有條,不得不說兩個字 —— 真香。

明天我們會接續下去,『蓋一棟 Django 小屋』將 Django 與 PostgreSQL 一起運行起來。


上一篇
Day3 Django?我很好奇!
下一篇
Day5 蓋一棟 Django 小屋
系列文
全能住宅改造王,Django 多租戶架構的應用 —— 實作一個電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言